Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

proxy protocol: new feature auto-detect proxy protocol #18951

Merged
merged 61 commits into from
May 6, 2022

Conversation

kdorosh
Copy link
Contributor

@kdorosh kdorosh commented Nov 9, 2021

Signed-off-by: Kevin Dorosh kevin.dorosh@solo.io

Commit Message: Auto-detect proxy protocol
Additional Description: Allows users to opt-in to functionality to auto-detect proxy protocol if present, and skip the filter if it's not present.
Risk Level: Low, opt-in new feature only hits new codepath if configured
Testing: Added tests for new codepath that cover both passthrough and fragmented proxy protocol scenarios
Docs Changes: N/A, outside of auto-generated API docs
Fixes: #18888

Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
@repokitteh-read-only
Copy link

Hi @kdorosh, welcome and thank you for your contribution.

We will try to review your Pull Request as quickly as possible.

In the meantime, please take a look at the contribution guidelines if you have not done so already.

🐱

Caused by: #18951 was opened by kdorosh.

see: more, trace.

@repokitteh-read-only
Copy link

CC @envoyproxy/api-shepherds: Your approval is needed for changes made to (api/envoy/|docs/root/api-docs/).
envoyproxy/api-shepherds assignee is @adisuissa
CC @envoyproxy/api-watchers: FYI only for changes made to (api/envoy/|docs/root/api-docs/).

🐱

Caused by: #18951 was opened by kdorosh.

see: more, trace.

Kevin Dorosh added 3 commits November 10, 2021 03:07
Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
…-fork into auto_detect_proxy_protocol

Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
@kdorosh kdorosh changed the title Auto-detect proxy protocol proxy protocol: auto-detect proxy protocol Nov 10, 2021
@kdorosh kdorosh changed the title proxy protocol: auto-detect proxy protocol proxy protocol: new feature auto-detect proxy protocol Nov 10, 2021
Kevin Dorosh added 3 commits November 10, 2021 03:15
Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
@@ -434,6 +443,9 @@ ReadOrParseState Filter::readProxyHeader(Network::IoHandle& io_handle) {
if (nread < 1) {
ENVOY_LOG(debug, "failed to read proxy protocol (no bytes read)");
return ReadOrParseState::Error;
} else if (nread < PROXY_PROTO_V2_HEADER_LEN && config_.get()->detectProxyProtocol()) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if the client send a partial v1 protocol header, I feel this will skip the process the v1 protocol header. it would be great to add an unitest for this case.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks for the feedback, addressed in ed4fb54

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

// NOTICE: only enable if ALL traffic to the listener comes from a trusted source.
// Defaults to false. If true, attempt to detect proxy protocol if present, and allow
// requests through if proxy protocol is not used on the connection.
bool detect_proxy_protocol = 2;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I feel the major goal is allow the requests through if proxy protocol is not used. And actually the whole proxy protocol filter is about detect the proxy protocol, so this option name feels confuse. Should we call it something like allow_requests_with_proxy_protocol?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1 please clarify the name.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like that better as well, addressed in bcc7aef

Kevin Dorosh added 3 commits November 10, 2021 14:46
Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
@kdorosh
Copy link
Contributor Author

kdorosh commented Nov 10, 2021

thanks for the feedback @soulxu, please let me know if there's anything else you need on my end. also happy to chat on slack if that's easier, I'm in the envoy slack as @kdorosh

Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
Copy link
Contributor

@adisuissa adisuissa left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for working on this.
Left a few comments.

@@ -40,4 +40,9 @@ message ProxyProtocol {

// The list of rules to apply to requests.
repeated Rule rules = 1;

// NOTICE: only enable if ALL traffic to the listener comes from a trusted source.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should probably in an .. attention:: clause.
See example.

I also suggest to rephrase the comment, starting with with it does, its default value, and then the notice part.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the example, addressed in 91c9a1b

// NOTICE: only enable if ALL traffic to the listener comes from a trusted source.
// Defaults to false. If true, attempt to detect proxy protocol if present, and allow
// requests through if proxy protocol is not used on the connection.
bool detect_proxy_protocol = 2;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1 please clarify the name.

@@ -47,6 +47,7 @@ Config::Config(
Stats::Scope& scope,
const envoy::extensions::filters::listener::proxy_protocol::v3::ProxyProtocol& proto_config)
: stats_{ALL_PROXY_PROTOCOL_STATS(POOL_COUNTER(scope))} {
detect_proxy_protocol_ = proto_config.detect_proxy_protocol();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should be set in the c'tor's member initialization list above.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in c45ecc7

* Filter configuration that determines if we should pass-through failed proxy protocol
* requests. Should only be configured to true for trusted downstreams.
*/
bool detectProxyProtocol() const;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The name here should also be clear (following the api field name change).

@@ -222,6 +222,19 @@ TEST_P(ProxyProtocolTest, V1Basic) {
disconnect();
}

TEST_P(ProxyProtocolTest, DetectNoProxyProtocol) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add a comment on what the test is validating.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in 4259f1a, please let me know if this doesn't clarify what might have been confusing

// Release the file event so that we do not interfere with the connection read events.
io_handle.resetFileEvents();
cb_->continueFilterChain(true);
return ReadOrParseState::Done;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This method doesn't need to return anything, and the returned status should probably be only at the end of Filter::onReadWorker()

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

agree, addressed in 2b4a89a

@adisuissa
Copy link
Contributor

Just realized there was a race where some of the comments were addressed in a recent commit.
Please ping me once the other comments are addressed.

Kevin Dorosh added 3 commits November 10, 2021 15:20
Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
Kevin Dorosh added 2 commits November 10, 2021 15:28
Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
@kdorosh
Copy link
Contributor Author

kdorosh commented Nov 10, 2021

@adisuissa all comments should be addressed

proto_config.set_allow_requests_without_proxy_protocol(true);
connect(true, &proto_config);

write("PROXY TCP4");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should test the case of the first write is not full v1 protocol signature, like just one char 'P'

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in 6a0d49b

Copy link
Contributor Author

@kdorosh kdorosh Nov 10, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm actually not sure this is possible simultaneously with the fragmented/partial protocol without the possibility for false positive, e.g.

TEST_P(ProxyProtocolTest, TinyPartialV1ReadWithAllowNoProxyProtocolThisFails) {

  envoy::extensions::filters::listener::proxy_protocol::v3::ProxyProtocol proto_config;
  proto_config.set_allow_requests_without_proxy_protocol(true);
  connect(true, &proto_config);

  write("P"); // matches the beginning of v1 proxy protocol

  dispatcher_->run(Event::Dispatcher::RunType::NonBlock);

  write("BOGUS");

  expectData("PBOGUS"); // we will consume `P` and upstream gets `BOGUS` not `PBOGUS`

  disconnect();
}

this is why in the initial implementation I required that the initial read from recv have enough bytes available on the initial MSG_PEEK to make the determination on the v1/v2 proxy header.

We can leave the PR as it is (or perhaps preferably throw a hard error if we consumed some bytes and then realize we had a false positive?) with the understanding that there could be false positives on identifying proxy protocol, additionally with the understanding that this is quite rare and will not likely happen in practice (except perhaps for single byte reads of P and HTTP POST/PUT request?). In exchange, we get support for fragmented/partial reads. Thoughts?

Also willing to go back to my original version (before 6a0d49b which addresses the initial concern with partial reads) which addresses the potential false positive here

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not following. How would the filter consume the P only?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Running the test above, we do recv with MSG_PEEK and just get P here.

Then before we continue the loop, we read that byte for real (no MSG_PEEK) here. Thus when we do our second recv and we get BOGUS we have already consumed P. We correctly identify that the request is not proxy protocol, but the request forwarded upstream has a missing byte(s) (in this case, just P).

The only way I see to avoid false positives identifying the header and always send the correct response up the filter chain is to require that the initial MSG_PEEK has enough bytes to detect v1/v2 header (at most 16, which seems reasonable for this opt-in only codepath)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, I see.

I think you need to fix this case. You may have to restructure the code such that no bytes are read (without MSG_PEEK) until we've decided 100% whether this is a proxy header or not.

I think it's probably good enough to look for either PROXY_PROTO_V1_SIGNATURE or PROXY_PROTO_V2_SIGNATURE. If the connections starts with either of those, but then doesn't have a valid full proxy protocol header, abort the connection as we currently do. If the connection starts with bytes that match neither of those signatures, and the new option is enabled, don't read() any bytes and continue the filter chain. Will that work?

Copy link
Contributor Author

@kdorosh kdorosh Nov 10, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it will work. Implemented in 6f19883 and 0927000

@@ -434,6 +445,13 @@ ReadOrParseState Filter::readProxyHeader(Network::IoHandle& io_handle) {
if (nread < 1) {
ENVOY_LOG(debug, "failed to read proxy protocol (no bytes read)");
return ReadOrParseState::Error;
} else if (nread < PROXY_PROTO_V2_HEADER_LEN &&
config_.get()->allowRequestsWithoutProxyProtocol()) {
if (nread < PROXY_PROTO_V1_SIGNATURE_LEN ||
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Although it is rare case, there still have the chance of receiving the partial v1 signature, like just a 'P' char, the left of the signature received by the second recv call. But this check will just skip the left of signature checking.

we could return SkipFilterError at https://github.com/envoyproxy/envoy/pull/18951/files#diff-a35fc10b1ce97239d02ac1791aac05069eaf253d8efc77cefe93749f901e36abL446
Then it will got all the data, and compared the signature of v1 and v2.

But if we only receive very short data from the client (short than both v1 and v2 signature), then I feel we only can waiting for a timeout of listener filter. But that is bad for the usecase of issue.

Another idea is if the nread is less than v1 and v2 signature, then we compare part of signature, like if the first byte is X', then compare to the first byte of v1 signature, it is P`. Also compare the first byte of v2 signature, then we know it can't be the proxy protocol.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@soulxu can you update the link from

we could return SkipFilterError at https://github.com/envoyproxy/envoy/pull/18951/files#diff-a35fc10b1ce97239d02ac1791aac05069eaf253d8efc77cefe93749f901e36abL446
Then it will got all the data, and compared the signature of v1 and v2.

to a link to main / a commit and where you're proposing this change? I think with the recent commits to this PR that the link provided is dated, I'm not sure where you're proposing we return the error

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

also related #18951 (comment)

Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
@ggreenway
Copy link
Contributor

I like the current version better, due to simplicity. In nearly all cases, all the bytes for comparision will arrive in the first packet, and we're only comparing roughly two machine words of data (on 64-bit); I think the performance difference will be unmeasurable. I think the simplicity out-weights the small amount of duplication (of cpu cycles and code) in this case.

@soulxu
Copy link
Member

soulxu commented May 2, 2022

I think

Agree with this version is more simple.

@kdorosh thanks for your patience and trying out two versions, currently code is LGTM now

Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
@kdorosh kdorosh requested a review from ggreenway May 3, 2022 16:02
Kevin Dorosh added 3 commits May 3, 2022 19:17
Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
Copy link
Contributor

@ggreenway ggreenway left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ugh; I wrote all this yesterday and forgot to hit "submit review". Sorry for the delay.

/wait

// For more information on the security implications of this feature, see
// https://www.haproxy.org/download/2.1/doc/proxy-protocol.txt
//
// While incredibly rare, requests of 12 or fewer bytes that match the
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you can remove "While incredibly rare" from the docs.

Also, I think this paragraph should either have attention:: or note:: header above it.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

addressed in 392124e

@@ -45,6 +45,7 @@ New Features
* dns_resolver: added :ref:`include_unroutable_families<envoy_v3_api_field_extensions.network.dns_resolver.apple.v3.AppleDnsResolverConfig.include_unroutable_families>` to the Apple DNS resolver.
* ext_proc: added support for per-route :ref:`grpc_service <envoy_v3_api_field_extensions.filters.http.ext_proc.v3.ExtProcOverrides.grpc_service>`.
* on_demand: :ref:`OnDemand <envoy_v3_api_msg_extensions.filters.http.on_demand.v3.OnDemand>` got extended to hold configuration for on-demand cluster discovery. A similar message for :ref:`per-route configuration <envoy_v3_api_msg_extensions.filters.http.on_demand.v3.PerRouteConfig>` is also added.
* proxy protocol: added support for allowing requests without proxy protocol on the listener from trusted downstreams as an opt-in flag.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add a link to the new config setting.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

addressed in 392124e

@@ -78,6 +83,8 @@ Network::FilterStatus Filter::onData(Network::ListenerFilterBuffer& buffer) {
return Network::FilterStatus::StopIteration;
} else if (read_state == ReadOrParseState::TryAgainLater) {
return Network::FilterStatus::StopIteration;
} else if (read_state == ReadOrParseState::SkipFilter) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you make this into a switch/case on read_state? Then the compiler can warn if not all cases are handled.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

addressed in 392124e

if (!matchv2 && !matchv1) {
// The bytes we have seen so far do not match v1 or v2 proxy protocol, so we can safely
// short-circuit
ENVOY_LOG(debug, "request does not use v1 or v2 proxy protocol, forwarding as is");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be at trace level because it is expected to happen in this configuration

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

addressed in 392124e

private:
absl::flat_hash_map<uint8_t, KeyValuePair> tlv_types_;
const bool allow_requests_without_proxy_protocol_{};
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doesn't need the {} initializer at the end because it is always initialized in the constructor.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

addressed in 392124e

std::string msg = "data";
EXPECT_GT(PROXY_PROTO_V1_SIGNATURE_LEN,
msg.length()); // Ensure we attempt parsing byte by byte using `search_index_`
EXPECT_GT(PROXY_PROTO_V2_SIGNATURE_LEN, msg.length());
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ditto

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

addressed in 392124e

EXPECT_GT(PROXY_PROTO_V2_SIGNATURE_LEN, msg.length());

write(msg);

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

delete extra newline

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

addressed in 392124e

write(msg);

expectData(msg);

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

delete extra newline

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

addressed in 392124e

connect(true, &proto_config);

std::string msg = "more data more data more data";
EXPECT_GT(msg.length(),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ASSERT_GT

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

addressed in 392124e

@@ -526,6 +608,19 @@ TEST_P(ProxyProtocolTest, V2ShortV4) {
expectProxyProtoError();
}

TEST_P(ProxyProtocolTest, V2ShortV4WithAllowNoProxyProtocol) {
// An ipv4/tcp connection that has incorrect addr-len encoded
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An ipv4/tcp PROXY header that....

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

addressed in 392124e

Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
@kdorosh
Copy link
Contributor Author

kdorosh commented May 4, 2022

Ugh; I wrote all this yesterday and forgot to hit "submit review". Sorry for the delay.

@ggreenway no problem at all, thanks again for the feedback and detailed review!

Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
soulxu
soulxu previously approved these changes May 4, 2022
Copy link
Member

@soulxu soulxu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks

Copy link
Contributor

@ggreenway ggreenway left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just one final nit.

@adisuissa can you review the API?

} else if (read_state == ReadOrParseState::SkipFilter) {
case ReadOrParseState::SkipFilter:
return Network::FilterStatus::Continue;
default:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove the default case. Then the compiler will warn/error if there are missing enum cases. I think it's possible that you won't need the return outside the switch either, if all cases are handled and all of them have a return.

Copy link
Contributor Author

@kdorosh kdorosh May 5, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

addressed in 5c50e23

unfortunately the compiler isn't smart enough to tell that every case is implemented and returns; thus we need the ghost "default" case at the end of the function after the switch statement

source/extensions/filters/listener/proxy_protocol/proxy_protocol.cc: In member function 'virtual Envoy::Network::FilterStatus Envoy::Extensions::ListenerFilters::ProxyProtocol::Filter::onData(Envoy::Network::ListenerFilterBuffer&)':
source/extensions/filters/listener/proxy_protocol/proxy_protocol.cc:93:1: error: control reaches end of non-void function [-Werror=return-type]
   93 | }
      | ^

I removed the default case regardless and confirmed that compiler will fail if any case is not implemented

Kevin Dorosh added 2 commits May 5, 2022 15:41
Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
@ggreenway
Copy link
Contributor

/retest

@repokitteh-read-only
Copy link

Retrying Azure Pipelines:
Retried failed jobs in: envoy-presubmit

🐱

Caused by: a #18951 (comment) was created by @ggreenway.

see: more, trace.

Copy link
Contributor

@adisuissa adisuissa left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/lgtm api

@repokitteh-read-only repokitteh-read-only bot removed the api label May 5, 2022
@ggreenway ggreenway enabled auto-merge (squash) May 5, 2022 20:22
@kdorosh
Copy link
Contributor Author

kdorosh commented May 6, 2022

@adisuissa ci is passing; I think we need a final approval from you here since you requested changes before? Thanks!

@ggreenway ggreenway merged commit 18c59ea into envoyproxy:main May 6, 2022
ravenblackx pushed a commit to ravenblackx/envoy that referenced this pull request Jun 8, 2022
…voyproxy#18951)

Allows users to opt-in to functionality to auto-detect proxy protocol if present, and skip the filter if it's not present.

Signed-off-by: Kevin Dorosh <kevin.dorosh@solo.io>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Add feature flag to allow requests without proxy protocol
7 participants